/* SINTACTICO */
grammar AnaGDL;

@header{ package pl.equipo13.p6; }

@lexer::header{ package pl.equipo13.p6; }

@rulecath { 
 	catch (RecognitionException ae) {
               System.err.println(ae.getMessage());
           throw ae;
       }
}

@members{
	boolean titulo;
	boolean etiqueta;
	boolean borde;
	
	boolean origen;
	boolean destino;
	boolean estilo;
}

entrada: GRAPH DOSPUNTOS ALLAVE (nodo | arista)* CLLAVE;

nodo: { titulo = false; etiqueta = false; borde = false; } NODE DOSPUNTOS ALLAVE argumentos_n {titulo && etiqueta}? CLLAVE;
argumentos_n: ( {!titulo}? titulo | {!etiqueta}? etiqueta | {!borde}? borde)*;
titulo: TITLE DOSPUNTOS CADENA { titulo = true; };
etiqueta: LABEL DOSPUNTOS CADENA { etiqueta = true; };
borde: BORDERSTYLE DOSPUNTOS (SOLID | DASHED | DOTTED) { borde = true;};

arista: {origen = false; destino = false; estilo = false; } EDGE DOSPUNTOS ALLAVE argumentos_a {origen && destino}? CLLAVE;
argumentos_a: ({!origen}? origen | {!destino}? destino | {!estilo}? estilo)+;
origen: SOURCE DOSPUNTOS CADENA { origen = true; };
destino: TARGET DOSPUNTOS CADENA { destino = true; };
estilo: ARROWSTYLE DOSPUNTOS (SOLID | LINE | NONE) { estilo = true; };

/* LEXICO */

GRAPH : 'graph';
NODE : 'node';
EDGE : 'edge';
TITLE : 'title';
LABEL : 'label';
TARGET : 'target';
BORDERSTYLE : 'borderstyle';
SOLID : 'solid';
DASHED : 'dashed';
DOTTED : 'dotted';
SOURCE : 'source';
ARROWSTYLE : 'arrowstyle';
LINE : 'line';
NONE : 'none';
fragment LETRA : ('a'..'z');
fragment COMILLAS: '"';
fragment NUEVA_LINEA: ('\n' | '\r\n');
IDENT: (LETRA)+;
fragment COMENTARIOBARRA: '//';
COMENTARIO: COMENTARIOBARRA (options {greedy=false;}:.)* NUEVA_LINEA {$channel=HIDDEN;};
CADENA: COMILLAS (options { greedy=false; }:.)* COMILLAS;
BLANCO: (' '|'\t'|'\n'|'\r\n'){$channel=HIDDEN;};
DOSPUNTOS: ':';
ALLAVE: '{';
CLLAVE: '}';